// File: jmcomic-core/src/main/java/dev/jukomu/common/util/time/TimeUtils.java
package dev.jukomu.common.util.time;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.TimeUnit;

public class TimeUtils {

    /**
     * 让当前线程休眠指定秒数。
     *
     * @param seconds 秒数
     */
    public static void sleep(double seconds) {
        if (seconds <= 0) {
            return;
        }
        try {
            TimeUnit.MILLISECONDS.sleep((long) (seconds * 1000));
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt(); // Restore interrupt status
        }
    }

    /**
     * 获取当前时间戳（秒）。
     *
     * @param asInt 是否返回整数秒（long类型）
     * @return 时间戳
     */
    public static long timestamp(boolean asInt) {
        return Instant.now().getEpochSecond();
    }

    /**
     * 获取当前时间戳（秒）。
     *
     * @return 整数秒时间戳
     */
    public static long timestamp() {
        return timestamp(true);
    }

    /**
     * 格式化时间戳为字符串。
     *
     * @param timestamp 时间戳（秒）
     * @param format    时间格式，如 "yyyy-MM-dd HH:mm:ss"
     * @return 格式化后的时间字符串
     */
    public static String formatTimestamp(Long timestamp, String format) {
        if (timestamp == null) {
            timestamp = timestamp(); // Use current timestamp if null
        }
        LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(timestamp), ZoneId.systemDefault());
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
        return dateTime.format(formatter);
    }

    /**
     * 格式化当前时间为字符串。
     *
     * @param format 时间格式，如 "yyyy-MM-dd HH:mm:ss"
     * @return 格式化后的时间字符串
     */
    public static String formatTimestamp(String format) {
        return formatTimestamp(null, format);
    }

    /**
     * 将时间字符串解析为时间戳。
     *
     * @param timeStr 时间字符串
     * @param pattern 时间格式，如 "yyyy-MM-dd HH:mm:ss"
     * @param asInt   是否返回整数秒（long类型）
     * @return 时间戳
     */
    public static long unformatTimestamp(String timeStr, String pattern, boolean asInt) {
        LocalDateTime dateTime = LocalDateTime.parse(timeStr, DateTimeFormatter.ofPattern(pattern));
        long ts = dateTime.atZone(ZoneId.systemDefault()).toEpochSecond();
        return asInt ? ts : ts; // Java long already acts as int for this purpose
    }
}